package com.mujin.keji.collectionsystem.http;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONPObject;
import com.mujin.keji.collectionsystem.base.BaseDto;
import com.mujin.keji.collectionsystem.base.BaseVo;
import com.mujin.keji.collectionsystem.dto.UploadFileDto;
import com.mujin.keji.collectionsystem.module.login.dto.LoginDto;
import com.mujin.keji.collectionsystem.module.login.vo.LoginCollectionVo;
import com.mujin.keji.collectionsystem.module.login.vo.LoginVo;
import com.mujin.keji.collectionsystem.module.main.dto.BannerListDto;
import com.mujin.keji.collectionsystem.module.main.dto.QueryPhoneDto;
import com.mujin.keji.collectionsystem.module.main.dto.SavePhoneDto;
import com.mujin.keji.collectionsystem.module.main.vo.BannerVo;
import com.mujin.keji.collectionsystem.module.main.vo.QueryPhoneVo;
import com.mujin.keji.collectionsystem.module.main.vo.SavePhoneVo;
import com.mujin.keji.collectionsystem.module.message.dto.MsgDto;
import com.mujin.keji.collectionsystem.module.message.vo.MsgVo;
import com.mujin.keji.collectionsystem.module.mypager.dto.CheckPwdDto;
import com.mujin.keji.collectionsystem.module.mypager.dto.LateVersionDto;
import com.mujin.keji.collectionsystem.module.mypager.dto.LogoutDto;
import com.mujin.keji.collectionsystem.module.mypager.dto.UpdatePwdDto;
import com.mujin.keji.collectionsystem.module.mypager.dto.UpdateUserDto;
import com.mujin.keji.collectionsystem.module.mypager.dto.UserInfoDto;
import com.mujin.keji.collectionsystem.module.mypager.dto.VersionDto;
import com.mujin.keji.collectionsystem.module.mypager.vo.CheckPwdVo;
import com.mujin.keji.collectionsystem.module.mypager.vo.GetMsgVo;
import com.mujin.keji.collectionsystem.module.mypager.vo.LateVersionVo;
import com.mujin.keji.collectionsystem.module.mypager.vo.UpdatePwdVo;
import com.mujin.keji.collectionsystem.module.mypager.vo.UpdateUserVo;
import com.mujin.keji.collectionsystem.module.mypager.vo.UserInfoVo;
import com.mujin.keji.collectionsystem.module.mypager.vo.VersionVo;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.ApplyCaseDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.CallDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.CaseInfoDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.LabelsDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.MarkDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.QueryContactDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.QueryUserDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.StatusCountDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.VisitRecordDetailDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.VisitRecordDto;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.ApplyCaseVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.BeginVisitVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.CallVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.CaseInfoVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.LabelVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.MarkVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.QueryContactVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.QueryUserVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.SaveVisitRecordVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.StatusCountVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.VisitRecordDetailVo;
import com.mujin.keji.collectionsystem.module.protectionrules.dto.OutRuleDto;
import com.mujin.keji.collectionsystem.module.protectionrules.vo.OutRuleVo;
import com.mujin.keji.collectionsystem.module.sign.dto.SignDetailDto;
import com.mujin.keji.collectionsystem.module.sign.dto.SignDto;
import com.mujin.keji.collectionsystem.module.sign.vo.SignDetailVo;
import com.mujin.keji.collectionsystem.module.sign.vo.SignVo;
import com.mujin.keji.collectionsystem.module.tripplan.dto.PathPlanDto;
import com.mujin.keji.collectionsystem.module.tripplan.dto.QueryPlanDetailListDto;
import com.mujin.keji.collectionsystem.module.tripplan.dto.QueryPlanListDto;
import com.mujin.keji.collectionsystem.module.tripplan.vo.PathPlanVo;
import com.mujin.keji.collectionsystem.module.tripplan.vo.QueryPlanDetailVo;
import com.mujin.keji.collectionsystem.module.tripplan.vo.QueryPlanVo;
import com.mujin.keji.collectionsystem.module.updata.dto.UploadDto;
import com.mujin.keji.collectionsystem.module.updata.vo.UploadListVo;
import com.mujin.keji.collectionsystem.utils.HttpUtil;

import java.io.File;
import java.util.List;

import io.reactivex.Flowable;
import retrofit2.http.Body;
import retrofit2.http.POST;

public class Api {

    /**
     * 登录接口
     *
     * @param vo
     * @return
     */

    public static Flowable<BaseDto<LoginDto>> login(LoginVo vo) {
        return RequetRetrofit.getInstance().login(HttpUtil.convertVo2Params(vo));

    }

    /**
     * 退出登录接口
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<LogoutDto>> logout(BaseVo vo) {
        return RequetRetrofit.getInstance().logout(HttpUtil.convertVo2Params(vo));
    }

    /**
     * 获取广告bananer接口
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<BannerListDto>> getAdvertises(BannerVo vo) {
        return RequetRetrofit.getInstance().getAdvertises(vo);
    }

    /**
     * 签到接口
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<SignDto>> sign(SignVo vo) {
        return RequetRetrofit.getInstance().sign(vo);
    }

    /**
     * 签到详情接口
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<SignDetailDto>> signGetDate(SignDetailVo vo) {
        return RequetRetrofit.getInstance().signGetDate(vo);
    }

    /**
     * 通知列表接口
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<MsgDto>> queryMessage(MsgVo vo) {
        return RequetRetrofit.getInstance().queryMessage(vo);
    }

    /**
     * 上传单个案件文件
     *
     * @param vo
     * @param files
     * @return
     */
    public static Flowable<BaseDto<UploadDto>> uploadUserFile(BaseVo vo, List<File> files, String mediaType) {
        return RequetRetrofit.getInstance().uploadFileWithRequestBody(HttpUtil.filesToMultipartBody(vo, files, mediaType));
    }


    /**
     * @param vo
     * @param files
     * @return
     */
    public static Flowable<BaseDto<UploadDto>> uploadFileList(BaseVo vo, List<File> files, String mediaType, UploadListener listener) {
        return UploadRetrofit.getInstance(listener).uploadFileWithRequestBody(HttpUtil.filesToMultipartBody(vo, files, mediaType));
    }

    /**
     * @param voList
     * @param mediaType
     * @param listener
     * @return
     */
    public static Flowable<BaseDto<UploadDto>> uploadFileList(List<UploadListVo> voList, String mediaType, UploadListener listener) {
        return UploadRetrofit.getInstance(listener).uploadFileWithRequestBody(HttpUtil.filesToMultipartBody(voList, mediaType));
    }

    /**
     * 修改密码接口
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<UpdatePwdDto>> changeUserPassword(UpdatePwdVo vo) {
        return RequetRetrofit.getInstance().changeUserPassword(HttpUtil.convertVo2Params(vo));
    }

    /**
     * 检查密码
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<CheckPwdDto>> checkPwd(CheckPwdVo vo) {
        return RequetRetrofit.getInstance().checkPwd(HttpUtil.convertVo2Params(vo));
    }

    /**
     * 修改用户信息
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<UpdateUserDto>> update(UpdateUserVo vo) {
        return RequetRetrofit.getInstance().update(vo);
    }

    /**
     * 查询拜访任务列表
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<ApplyCaseDto>> queryApplyCase(ApplyCaseVo vo) {
        return RequetRetrofit.getInstance().queryApplyCase(vo);
    }

    /**
     * 查询案件详情
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<CaseInfoDto>> queryCaseInfo(CaseInfoVo vo) {
        return RequetRetrofit.getInstance().queryCaseInfo(HttpUtil.convertVo2Params(vo));
    }

    /**
     * 催收记录
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<MarkDto>> queryMark(MarkVo vo) {
        return RequetRetrofit.getInstance().queryMark(vo);
    }

    /**
     * 外访任务统计
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<List<StatusCountDto>>> count(StatusCountVo vo) {
        return RequetRetrofit.getInstance().count(vo);
    }

    /**
     * 行程规划列表
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<QueryPlanListDto>> queryPlan(QueryPlanVo vo) {
        return RequetRetrofit.getInstance().queryPlan(vo);
    }

    /**
     * 行程规划
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<PathPlanDto>> pathPlan(PathPlanVo vo) {
        return RequetRetrofit.getInstance().pathPlan(HttpUtil.convertVo2Params(vo));
    }

    /**
     * 行程规划详情
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<QueryPlanDetailListDto>> queryDetail(QueryPlanDetailVo vo) {
        return RequetRetrofit.getInstance().queryDetail(HttpUtil.convertVo2Params(vo));
    }


    /**
     * 上传单头像
     *
     * @param
     * @param files
     * @return
     */
    public static Flowable<BaseDto<String>> updateImg(List<File> files) {
        return RequetRetrofit.getInstance().updateImg(HttpUtil.filesToMultipartBodyParts("file", files, "*/*"));
    }


    /**
     * 查询用户信息
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<UserInfoDto>> queryUserInfo(UserInfoVo vo) {
        return RequetRetrofit.getInstance().queryUserInfo(vo);
    }

    /**
     * 查询外访守则
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<OutRuleDto>> queryOutRule(OutRuleVo vo) {
        return RequetRetrofit.getInstance().queryOutRule(vo);
    }

    /**
     * 查询催记标签
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<LabelsDto>> queryLabels(LabelVo vo) {
        return RequetRetrofit.getInstance().queryLabels(vo);
    }

    /**
     * 外访详情
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<VisitRecordDetailDto>> visitRecord(VisitRecordDetailVo vo) {
        return RequetRetrofit.getInstance().visitRecord(HttpUtil.convertVo2Params(vo));
    }

    /**
     * 一键报警
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<CallDto>> call(CallVo vo) {
        return RequetRetrofit.getInstance().call(vo);
    }

    /**
     * 保存外访记录
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<VisitRecordDto>> saveVisitRecord(SaveVisitRecordVo vo) {
        return RequetRetrofit.getInstance().saveVisitRecord(vo);
    }

    /**
     * 搜索协助专员
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<QueryUserDto>> queryUser(QueryUserVo vo) {
        return RequetRetrofit.getInstance().queryUser(HttpUtil.convertVo2Params(vo));
    }

    /**
     * 保存手机号码
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<SavePhoneDto>> savePhone(SavePhoneVo vo) {
        return RequetRetrofit.getInstance().savePhone((vo));
    }

    /**
     * 查询手机号码
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<QueryPhoneDto>> queryPhone(QueryPhoneVo vo) {
        return RequetRetrofit.getInstance().queryPhone((HttpUtil.convertVo2Params(vo)));
    }
    /**
     * 案件联系人
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<QueryContactDto>> queryContact(QueryContactVo vo) {
        return RequetRetrofit.getInstance().queryContact((HttpUtil.convertVo2Params(vo)));
    }

    /**
     * 获取短信验证码
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<String>> sendSms(GetMsgVo vo) {
        return RequetRetrofit.getInstance().sendSms((HttpUtil.convertVo2Params(vo)));
    }
    /**
     * 判断是否开始外访
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<String>> beginVisit(BeginVisitVo vo) {
        return RequetRetrofit.getInstance().beginVisit((HttpUtil.convertVo2Params(vo)));
    }
    /**
     * 获取历史版本
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<VersionDto>> version(VersionVo vo) {
        return RequetRetrofit.getInstance().version((HttpUtil.convertVo2Params(vo)));
    }
    /**
     * 获取最新版本内容
     *
     * @param vo
     * @return
     */
    public static Flowable<BaseDto<LateVersionDto>> lasted(LateVersionVo vo) {
        return RequetRetrofit.getInstance().lasted((HttpUtil.convertVo2Params(vo)));
    }

    /**
     * 获取session
     * @param vo
     * @return
     */
    public static Flowable<String> getLoginSession(LoginCollectionVo vo) {

        return RequetRetrofit.getInstance().getLoginSession(vo);
    }



    public static Flowable<UploadFileDto> uploadSingle(BaseVo vo) {
        return RequetRetrofit.getInstance().uploadSingle(vo);
    }



    public static Flowable<JSONObject> updateApplyStatus(BaseVo vo) {
        return RequetRetrofit.getInstance().updateApplyStatus(vo);
    }








}
